package com.sure0000.thread;

import java.util.Vector;

/**
 * @author xuyouchang@supcon.com
 * @date 2020/4/29.
 */
public class TestVector {
    private static Vector<Integer> vector = new Vector<Integer>();

    /**
     * 很明显，尽管这里使用到的Vector的get()、remove()和size()方法都是同步的，但是在多线程的环境中，如果不在方法调用端做额外的同步措施的话，
     * 使用这段代码仍然是不安全的，因为如果另一个线程恰好在错误的时间里删除了一个元素，导致序号i已经不再可用的话，再用i访问数组就会抛出一个
     * ArrayIndexOutOfBoundsException。
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {

        while (true) {
            for (int i = 0; i < 10; i++) {
                vector.add(i);
            }

            Thread removeThread = new Thread(new Runnable() {
                @Override
                public void run() {
                    // 必须加锁
                    synchronized (vector) {
                        for (int i = 0; i < vector.size(); i++) {
                            vector.remove(i);
                        }
                    }

                }
            });

            Thread printThread = new Thread(new Runnable() {
                @Override
                public void run() {
                   synchronized (vector) {
                       for (int i = 0; i < vector.size(); i++) {
                           System.out.println((vector.get(i)));
                       }
                   }
                }
            });

            removeThread.start();
            printThread.start();

        }
    }

}
